home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
ikap
/
etc1
/
sincomp4.c
< prev
next >
Wrap
Text File
|
1999-12-22
|
2KB
|
112 lines
/*
サイン波合成 試作バージョン version 1.04
compiling :gcc -Wall -O2 -ldos sincomp4.c
by SJOM
*/
#include <stdlib.h>
#include <stdio.h>
#include <sys/dos.h>
#include <math.h>
static char *message=
" 合成サイン波生成プログラム version 1.04
BY SJOM
sinwave.x filename.p16 size(short int) α0(double) ω0 α1 ω1 α2 ω2
Vout=α0sin(ω0t+α1sin(ω1t+α2sin(ω2t)))
";
static int size;
static short *sound_data;
static double alpha0,alpha1,alpha2;
static double omega0,omega1,omega2;
#define sampling_frequency 15625
/* 内蔵ADPCM用周波数。他用に変える時は、ここを変更すること。
例.CD・ま~きゅり~ゆにっと 441000 */
static void
make_sinwave(void)
{
int loop;
double data;
double step,t=0,pai=3.141592653589793;
for (loop=0;loop<size;loop++)
sound_data[loop]=0;
step=2*pai/((double)sampling_frequency);
/*
15625Hz -> 1sec 15625 short words
100Hz -> 15625/100=156.25 short words/wave
360゚=2π -> 2π/156.25 radian/step
*/
for (loop=0;loop<size;loop++) {
data=alpha0*sin(omega0*t+alpha1*sin(omega1*t+alpha2*sin(omega2*t)));
sound_data[loop]+=data;
t+=step;
};
}
int
main(int argc,char **argv)
{
int fp;
if (argc<8) {
puts(message);
exit(0);
};
size=atoi(*(argv+2)) & 0xfffffff;
alpha0=atof(*(argv+3));
omega0=atof(*(argv+4));
alpha1=atof(*(argv+5));
omega1=atof(*(argv+6));
alpha2=atof(*(argv+7));
omega2=atof(*(argv+8));
sound_data=_dos_malloc(size*2);
if ((void *)sound_data>=(void *)0x81000000) {
puts("メモリーが不足しています。");
exit(-1);
};
make_sinwave();
_dos_delete(*(argv+1));
fp=_dos_open(*(argv+1),0x001);
if (fp<0) {
fp=_dos_create(*(argv+1),0b100000);
if (fp<0) {
printf("%s:出力ファイルがオープン出来ません!\n",*(argv+2));
exit(-1);
};
fp=_dos_open(*(argv+1),0x001);
};
_dos_seek(fp,0,0);
_dos_write(fp,(void *)sound_data,size*2);
_dos_close(fp);
_dos_mfree(sound_data);
exit(0);
}